<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>点击</div>
</body>
</html>
<script>
  // this 指向？
  // 1.在普通函数中，谁调用函数，this就指向谁。
  // 2.在全局作用域下，this指向的window。
  // 3.在setTimeout 中this指向的是window。
  // 4.在箭头函数中this和其父作用域的this指向保持一致。
  // 5.在构造函数中，this指向的是实例化出来的对象。
  // 6.在class类中，this指向的也是实例化出来的对象。

//   let dom = document.querySelector('div');
//   dom.onclick = function () {
//     console.log(this);
//     setTimeout(() => { // 箭头函数不固话this指向，箭头函数的this指向，和其父作用域的this指向有关系。
//         console.log(this);
//     })
//   }

//   let obj = {
//     name: "张三",
//     sing: function(){
//         console.log(this);
//     }
//   }

//   obj.sing();


//   function fn () {
//     console.log(this);
//   }
//   fn();


//   function Start(){ // 构造函数。
//     this.name = "李四"
//     console.log(this);
//   }
//   let obj1 = new Start();
//   console.log(obj1);

   
  // 改变this指向的三种方式？
  // bind apply call


//   let dom = document.querySelector('div');
  
//   function fn (val){
//     console.log(val);
//     console.log(this);
//     this.style.color = val;
//   }
//   fn();

// fn.apply(dom); // 把this指向dom

// fn.call(dom); // 把this指向dom

// fn.apply(dom,['blue']);
// fn.call(dom,'blue');
// apply call 都能改变this指向 传参方式不一样 apply 传参是 数组的方式，call 传参是，参数列表的形式。

// bind 也可以改变this指向，bind改变this指向不立即执行。
// fn.bind(dom)('blue');
// let ftn = fn.bind(dom);
// console.log(ftn);
// ftn('red')

// let a = this;
let dom = document.querySelector('div');
dom.onclick = function (){
    console.log(this);
}.bind(this) // bind 传入的是指向的对象。

console.log(this);

// 创建对象的几种方式？
// 1.子面量的方式来创建一个对象。
// let obj = {name:"王五"};
// 2.通过new关键字来创建
//   let obj = new Object({name:'张三'});
//   console.log(obj);
// 3.通过工厂函数来创建一个对象。
// function create (val,age){
//   let obj = new Object;
//   obj.name = val;
//   obj.age = age
//   return obj
// }

// console.log(create('赵四',18));

// 4.通过构造函数，来创建一个对象。

function Start(val){ // 构造函数，我们一般首字母大写
  this.name = val
}
let obj = new Start('小七');
console.log(obj);

// console.log(String);

// let num = new Number(1);
// console.log(num);
</script>